package voxToolkit;

import java.awt.AWTEvent;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;

import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import audio.AudioSintetizado;
import audio.SoundEvent;
import audio.SoundListener;

public class VoxEventos implements ListSelectionListener, FocusListener,
		ActionListener, SoundListener, KeyListener, ChangeListener
{

	private AudioSintetizado sintetizador;
	String TestaValor = "0";
	static private VoxEventos instancia = null;

	private VoxEventos()
	{

		sintetizador = AudioSintetizado.instancia();
		sintetizador.addSoundListener(this);
		new Thread(sintetizador).start();
	}

	static public VoxEventos instancia ()
	{
		if (instancia == null)
			instancia = new VoxEventos();

		return instancia;
	}

	@Override
	public void focusGained ( FocusEvent e )
	{

		if (e.getSource() instanceof VoxCombo)
		{

			VoxCombo voxCombo = (VoxCombo) e.getSource();
			System.out.println(voxCombo.getRotulo());

			sintetizador.escreve((String) voxCombo.getRotulo() + ". "
					+ (String) voxCombo.getSelectedItem());

		}

		if (e.getSource() instanceof VoxList)
		{

			VoxList voxList = (VoxList) e.getSource();
			System.out.println("Foco na List");

			sintetizador.escreve((String) voxList.getRotulo() + ". "
					+ (String) voxList.getSelectedValue());

		}

		if (e.getSource() instanceof VoxTextField)
		{

			VoxTextField voxTextField = (VoxTextField) e.getSource();
			System.out.println("Foco na caixa de texto");

			sintetizador.escreve((voxTextField.getRotulo()));

		}
		if (e.getSource() instanceof VoxSlider)
		{

			VoxSlider voxSlider = (VoxSlider) e.getSource();
			System.out.println("Entrei no VoxSlider");

			System.out.println(voxSlider.getRotulo());

			sintetizador.escreve((String) voxSlider.getRotulo() + ". "
					+ (String) voxSlider.getValor());
		}

		if (e.getSource() instanceof VoxTextArea)
		{

			VoxTextArea voxTextArea = (VoxTextArea) e.getSource();
			System.out.println("item selecionado"
					+ (String) voxTextArea.getText());
			sintetizador.escreve((String) voxTextArea.rotulo + ". "
					+ (String) voxTextArea.getText());
		}

		if (e.getSource() instanceof VoxTabbedPane)
		{

			VoxTabbedPane voxTabbedPane = (VoxTabbedPane) e.getSource();
			/*
			 * if (voxTabbedPane.jaFalou != 0) { sintetizador.escreve("Página "
			 * + voxTabbedPane.getTitleAt(voxTabbedPane .getSelectedIndex())); }
			 * voxTabbedPane.jaFalou++;
			 */
		}
	}

	@Override
	public void focusLost ( FocusEvent e )
	{
		// TODO Auto-generated method stub

	}

	@Override
	public void actionPerformed ( ActionEvent e )
	{

		if (e.getSource() instanceof VoxCombo)
		{

			VoxCombo voxCombo = (VoxCombo) e.getSource();
			sintetizador.escreve((String) voxCombo.getSelectedItem());
		}

	}

	@Override
	public void FimDeFala ( SoundEvent e )
	{
		// TODO Auto-generated method stub

	}

	@Override
	public void eventDispatched ( AWTEvent e )
	{

		if (e instanceof SoundEvent)
			FimDeFala((SoundEvent) e);

	}

	@Override
	public void stateChanged ( ChangeEvent e )
	{
		// TODO Auto-generated method stub
		if (e.getSource() instanceof VoxSlider)
		{
			VoxSlider voxSlider = (VoxSlider) e.getSource();
			System.out.println("TestaValor Antes =" + TestaValor);

			if (!(voxSlider.getValor().trim().equals(TestaValor.trim())))
			{
				if (!(TestaValor.trim().equals("0")))
				{
					sintetizador.escreve(voxSlider.getValor());
				}
				System.out.println(voxSlider.getValor() + "stateChanged");
				TestaValor = (String) voxSlider.getValor();
				System.out.println("TestaValor =" + TestaValor);
			}
		}
	}

	@Override
	public void valueChanged ( ListSelectionEvent e )
	{
		if (e.getSource() instanceof VoxList)
		{
			if (!e.getValueIsAdjusting())
			{
				VoxList voxList = (VoxList) e.getSource();
				sintetizador.escreve((String) voxList.getSelectedValue());

			}

		}
	}

	public void keyPressed ( KeyEvent e )
	{
		if (e.getSource() instanceof VoxTextField)
		{
			VoxTextField voxTextField = (VoxTextField) e.getSource();
			int lastPos = voxTextField.getCaretPosition();
			String conteudo = voxTextField.getText();

			{
				if (e.getKeyCode() == KeyEvent.VK_SPACE)
				{
					System.out.println("Espaço");
					return;
				}
			}
			if (e.getKeyCode() == KeyEvent.VK_LEFT)
			{

				if (!e.isControlDown())
				{
					if (lastPos >= 1)
					{
						char caracterAtual = (char) conteudo
								.codePointAt(lastPos - 1);
						String teste = Character.toString(caracterAtual);
						sintetizador.escreve(teste);
					}
				}
			}

			if (e.getKeyCode() == KeyEvent.VK_RIGHT)
			{
				try
				{
					if (!e.isControlDown())
					{
						char letra = (char) conteudo.codePointAt(lastPos);
						sintetizador.escreve(Character.toString(letra));
						System.out.println(letra);
					}
				}
				catch (StringIndexOutOfBoundsException el)
				{
					sintetizador.escreve("Fim de linha");
				}
				catch (Exception e1)
				{
					e1.printStackTrace();
				}
			}

			if (e.getKeyCode() == KeyEvent.VK_BACK_SPACE)
			{
				try
				{
					sintetizador.escreve("DEL "
							+ Character.toString(conteudo.charAt(lastPos - 1)));
				}
				catch (Exception e1)
				{
					e1.printStackTrace();
				}

			}
			if (e.getKeyCode() == KeyEvent.VK_F10)
			{
				try
				{
					sintetizador.escreve(conteudo);
				}
				catch (Exception e1)
				{
					e1.printStackTrace();
				}
			}
		}

	}

	@Override
	public void keyReleased ( KeyEvent e )
	{
		VoxTextField voxTextField;
		VoxTextArea voxTextArea;
		String conteudo;
		int posAtual;
		int posFim;

		if (e.getSource() instanceof VoxTextField)
		{
			voxTextField = (VoxTextField) e.getSource();
			conteudo = voxTextField.getText().trim();
			posAtual = voxTextField.getCaretPosition();

		}
		else
		{
			voxTextArea = (VoxTextArea) e.getSource();
			conteudo = voxTextArea.getText();
			posAtual = voxTextArea.getCaretPosition();

		}

		ArrayList guarda = new ArrayList();

		if (e.getKeyCode() == KeyEvent.VK_RIGHT && e.isControlDown())
		{
			try
			{
				int j = 0;
				posFim = posAtual - 1;
				boolean achouLetra = false;
				String palavra = "";

				if (posFim <= conteudo.length() - 1)
				{
					for (int i = posFim; posFim >= 0; --i)
					{
						if (i >= 0)
						{
							if (i <= conteudo.length() - 1)
							{
								if (!Character.isWhitespace(conteudo.charAt(i)))
								{
									guarda.add(conteudo.charAt(i));
									achouLetra = true;
								}

								else
								{
									if (achouLetra)
										break;
								}
							}
							else
								break;
						}
						else
							break;
					}
				}

				for (int i = guarda.size() - 1; i >= 0; --i)
				{
					palavra = palavra + guarda.get(i).toString();
				}
				sintetizador.escreve(palavra);
			}
			catch (Exception e1)
			{
				e1.printStackTrace();
			}

		}

		if (e.getKeyCode() == KeyEvent.VK_LEFT && e.isControlDown())
		{
			try
			{
				int j = 0;
				int posIni = posAtual;
				boolean achouLetra = false;
				String palavra = "";

				if (posIni <= conteudo.length() - 1)
				{
					for (int i = posIni; posIni <= conteudo.length() - 1; ++i)
					{
						if (i >= 0)
						{
							if (i <= conteudo.length() - 1)
							{
								if (!Character.isWhitespace(conteudo.charAt(i)))
								{
									guarda.add(conteudo.charAt(i));
									achouLetra = true;
								}
								else
								{
									if (achouLetra)
										break;
								}
							}
							else
								break;
						}
						else
							break;
					}
				}

				for (int i = 0; i <= guarda.size() - 1; ++i)
				{
					palavra = palavra + guarda.get(i).toString();
				}
				sintetizador.escreve(palavra);
			}
			catch (Exception e1)
			{
				e1.printStackTrace();
			}
		}
	}

	@Override
	public void keyTyped ( KeyEvent e )
	{
		char tecla = ' ';
		VoxTextField voxTextField;
		VoxTextArea voxTextArea;

		if (e.getSource() instanceof VoxTextField)
		{
			voxTextField = (VoxTextField) e.getSource();
		}
		else if (e.getSource() instanceof VoxTextArea)
		{
			voxTextArea = (VoxTextArea) e.getSource();
		}
		tecla = e.getKeyChar();
		sintetizador.escreve(Character.toString(tecla));
	}

}